#define _CRT_SECURE_NO_WARNINGS
//#include<iostream>
//#include<vector>
//#include<string>
//#include<unordered_map>
//using namespace std;
//
//int main()
//{
//	int m, n;
//	cin >> m >> n;
//	unordered_map<pair<int, int>, int> hash;
//	//vector<vector<int>> A(m, vector<int>(n, 0));
//	int k;
//	cin >> k;
//	while (k--)
//	{
//		int x, y;
//		cin >> x >> y;
//		int tmp;
//		cin >> tmp;
//		hash[{x, y}] = tmp;
//	}
//	cin >> k;
//	while (k--)
//	{
//		int x, y;
//		cin >> x >> y;
//		int tmp;
//		cin >> tmp;
//		if(hash.count({x,y}))
//			hash[{x, y}] += tmp;
//		else
//			hash[{x, y}] = tmp;
//	}
//	cout << hash.size() << endl;
//	for (auto e : hash)
//	{
//		cout << e.first.first << " " << e.first.second << " " << e.second << endl;
//	}
//	return 0;
//}
//#include<iostream>
//#include<vector>
//#include<string>
//#include<unordered_map>
//using namespace std;
//int main()
//{
//	string s;
//	getline(cin, s);
//	int len = s.size();
//	int maxlen = 1;
//	vector<vector<bool>> dp(len, vector<bool>(len, false));
//	for (int i = 0; i < len; i++)
//		dp[i][i] = true;
//	for (int i = 0; i < len - 1; i++)
//	{
//		if (s[i] == s[i + 1])
//		{
//			dp[i][i + 1] = true;
//			maxlen = 2;
//		}
//	}
//	for (int k = 3; k <= len; k++)
//	{
//		for (int i = 0; i < len - k + 1; i++)
//		{
//			int j = i + k - 1;
//			if (dp[i + 1][j - 1] && s[i] == s[j])
//			{
//				maxlen = k;
//				dp[i][j] = true;
//			}
//		}
//	}
//	cout << maxlen;
//	return 0;
//}
//#include<iostream>
//#include<vector>
//#include<string>
//#include<unordered_map>
//#include<algorithm>
//using namespace std;
//struct Position
//{
//	int x, y, value;
//};
//struct Compare
//{
//	bool operator()(Position n1, Position n2)
//	{
//		return n1.x < n2.x;
//	}
//};
//int main()
//{
//	int m, n, k;
//	cin >> m >> n >> k;
//	vector<Position> v;
//	while (k--)
//	{
//		Position tmp;
//		cin >> tmp.y >> tmp.x >> tmp.value;
//		v.push_back(tmp);
//	}
//	sort(v.begin(), v.end(),Compare());
//	for (auto& e : v)
//		cout << e.x << " " << e.y << " " << e.value << endl;
//	return 0;
//}
//#include <iostream>
//#include <vector>
//using namespace std;
//int main() {
//    int Ra, Ca, Rb, Cb;
//    cin >> Ra >> Ca;
//    vector<vector<int>> A(Ra, vector<int>(Ca));
//    for (int i = 0; i < Ra; ++i) {
//        for (int j = 0; j < Ca; ++j) {
//            cin >> A[i][j];
//        }
//    }
//    cin >> Rb >> Cb;
//    if (Ca != Rb) {
//        cout << "Error: "<<Ca<<" != "<<Rb<< endl;
//        return 0;
//    }
//    vector<vector<int>> B(Rb, vector<int>(Cb));
//    for (int i = 0; i < Rb; ++i) {
//        for (int j = 0; j < Cb; ++j) {
//            cin >> B[i][j];
//        }
//    }
//
//    vector<vector<int>> C(Ra, vector<int>(Cb, 0));
//    for (int i = 0; i < Ra; ++i) {
//        for (int j = 0; j < Cb; ++j) {
//            for (int k = 0; k < Ca; ++k) {
//                C[i][j] += A[i][k] * B[k][j];
//            }
//        }
//    }
//
//    cout << Ra << " " << Cb << endl;
//    for (int i = 0; i < Ra; ++i) {
//        for (int j = 0; j < Cb; ++j) {
//            cout << C[i][j];
//            if (j != Cb - 1) cout << " ";
//        }
//        cout << endl;
//    }
//
//    return 0;
//}
#include<iostream>
#include<string>
#include<vector>
#include<functional>
using namespace std;
int main()
{
	string text, pattern;
	cin >> text >> pattern;
	int sz = pattern.size();
	vector<int> next(sz + 1,0);
	next[0] = -1;
	int i = 0, j = -1;
	while (i < sz)
	{
		if (j == -1 || pattern[i] == pattern[j])
		{
			i++; j++;
			next[i] = j;
		}
		else
			j = next[j];
	}
	auto KMP = [&]()
	{
		int x = 0, y = 0;
		while (x < text.size())
		{
			if ( y == -1 || text[x] == pattern[y])
			{
				x++; y++;
				if (y == sz)
				{
					cout << x - y + 1 << endl;
					y = next[y];
				}
			}
			else
				y = next[y];
		}
	};
	KMP();
	i = 1;
	for (;i<sz;i++)
		cout <<next[i] << " ";
	cout << next[i];
	return 0;
}